home *** CD-ROM | disk | FTP | other *** search
- UFSL Universal Fontselector (c) 1991-1993 by Michael Thänitz
-
- UFSL ist Freeware.
-
- Wo liegt eigentlich das Problem? Nun ganz einfach, die Einstellung eines
- anderen als des Systemfonts ist eigentlich recht trivial. vst_font()
- stellt den Font ein, vst_point() stellt die Gröβe ein. Woher weiβ man
- aber nun welche Fonts es gibt und in welchen Gröβen sie vorliegen?
- Auch das ist recht einfach. Man lädt die Fonts, klappert alle Fonts nach
- Ihren "echten" Gröβen ab und stellt alles in einer Listbox dar.
- Tja, und da liegt das Problem. Ist die Abfage der Gröβen schon ein klein
- wenig kompliziert, schmeiβen bei Listbox die meisten Gelegenheits-
- programmierer das Handtuch. Entsprechend bescheiden sind dann auch die
- Ergebnisse. Hier springt UFSL nun ein und bietet den gleichen einfach
- zu programmierenden Komfort wie bei der Fileselectbox. Einfach die
- Fontauswahlbox mit einigen einfach zu erfahrenen Parametern versorgen,
- über den Cookie aufrufen und man erhält FontId und die Punktgröβe zurück.
- Ein entsprechendes Beispiel liegt mit FONTTEST.C vor. Der Programmierer
- entscheidet, ob es sich um einen konventionellen Dialog mit Let 'em Fly
- Unterstützung oder um einen Fensterdialog handelt.
-
- UFSL darf jedem Programm ohne Rücksprache kostenlos beigelegt werden.
- Trotzdem interessiert es mich natürlich, wo UFSL überall beiliegt.
-
- UFSL nutzt die Möglichkeiten von "Let 'em Fly" laut Doku Version 1.17.
- UFSL stellt beliebig viele Fonts mit je max. 16 Größen dar.
-
- ***************************************************************************
-
- Programmierschnittstelle:
- -------------------------
- UFSL ist eine Fontauswahlbox für den Autoordner. Sie bietet dem
- Programmierer eine einfache Programmierschnittstelle über einen Cookie.
-
- Der Cookie lautet: 'UFSL'.
- Der Cookie liefert einen Zeiger auf folgende Struktur:
-
- typedef struct
- {
- unsigned long id; /* UFSL ID (UFSL) */
- unsigned int version; /* Version (BCD-Format) */
- int dialtyp; /* 0=Dialog, 1=Fenster */
- int cdecl (*font_selinit)(void);
- int cdecl (*font_selinput)(
- int vdihandle,
- char *text, /* eigener Text, max. 34 Zeichen */
- int ftype, /* 1=nur monospaced Fonts, 0=alles */
- int *fretid, /* eingestellte FontId */
- int *fretsize /* eingestellte Fontgröße */
- );
- OBJECT *helpbutton; /* Typ: BOXTEXT */
- void cdecl (*helpfunc)(void); /* Benutzerdefinierte Helpfkt. */
-
- /**** ab Version 0.91 ********************************************/
- char *examplestr; /* Beispieltext für Fontdarstellung */
-
- /**** ab Version 0.96 ********************************************/
- void cdecl (*msgfunc)(int event, int msgbuf[]);/* Redrawfunktion */
- } UFSL;
-
- Aufruf:
- -------
- UFSL *ufsl;
- ufsl=(UFSL *)get_cookie('UFSL');
- ufsl->helpfunc= my_helpfunc; /* Hilfefunktion oder NULL */
- ufsl->msgfunc = my_msghandler; /* Redrawfunktion oder NULL, Dialtyp beachten */
- ufsl->fontsel_input(vdihandle,"Bitte Font auswählen",0,&id,&size);
- oder
- ufsl->fontsel_input(vdihandle,NULL,0,&id,&size);
-
- Returncodes:
- ------------
- 1 : Alles OK, Werte gültig.
- 0 : Abbruch gewählt.
- -1 : Out of memory.
- -2 : Unzulässiger Mehrfachaufruf.
- -3 : Fontgröße konnte nicht identifiziert werden.
- -4 : Anzahl Fonts muß größer null sein.
-
- Sonderfunktionen:
- -----------------
- void cdecl (*helpfunc)(void); /* Benutzerdefinierte Helpfkt. */
-
- UFSL kann eine benutzerdefinierbare Hilfefunktion über den ebenfalls
- optionalen Hilfebutton aufrufen. helpfunc() benötigt keine Parameter
- und liefert auch keinen Wert zurück.
-
-
-
- void cdecl (*msgfunc)(int event, int msgbuf[]);/* Redrawfunktion */
-
- Bei Verwendung von UFSL als Fensterdialog ist es notwendig eine
- Redrawfunktion zur Verfügung zu stellen. Sie schickt die anfallenden
- Events an das aufrufende Programm zurück, damit nach Verschieben
- des Dialogs die Hintergrundfenster restauriert werden können.
- msgfunc() liefert als ersten Parameter das Ergebnis von evnt_multi()
- und als zweiten Parameter die MsgPipe. Ein Returncode wird nicht
- benötigt. Das Anwenderprogramm muβ die nötigen Routinen zur Fenster-
- behandlung zur Verfügung stellen. wind_update(..._UPDATE) wird von
- UFSL nicht gesetzt, obliegt also dem rufenden Anwenderprogramm.
- Prinzipbedingt(?) ist die Memoryprotection von MTOS auszuschalten.
-
- Grundsätzlich gilt es zu überlegen, ob tatsächlich alle Events
- entsprechend beantwortet werden sollen. Ein WM_TOPPED, das andere
- eigene Fenster nach vorn bringt, sollte wohl nicht beantwortet werden,
- da UFSL naturgemäβ nur applikationsmodal sein kann, da UFSL ja in
- einem eigenen form_do() sprich evnt_multi() kreist.
-
- ***************************************************************************
-
- Versionsübersicht:
- ------------------
-
- Version 0.90 vom Mai 1993 (Dezember 1991)
- -----------------------------------------
- Ich möchte noch anmerken, das die Cookieinstallation noch recht dürftig
- ist. Es wird einfach installiert, ohne zu fragen ob Platz ist. Das Profibuch
- bietet hierzu eine m.E. fehlerhafte Beschreibung. Es wird von einen Nullcookie
- und seines Wertes gesprochen. Das ist m.E. ein Syntaxerror. Wer also
- vernünftige Cookieroutinen in 'C' hat, möchte mir doch bitte weiterhelfen.
-
- Dem Fensterdialog muβ noch seine Unmodalität abgewöhnt werden.
-
- Version 0.91 vom Mai 1993
- -------------------------
- Die Cookiefrage ist geklärt durch Assemblerroutinen von Arnd Beissner.
- Alle benutzerdefinierten Variablen werden beim Verlassen zurückgesetzt.
- Fonteinstellung über Editfeld mit Mausdoppelklick auf Beispieltext.(Nur
- Speedo).
-
- Version 0.92 vom Juni 1993
- --------------------------
- UFSL erkennt Auflösungswechsel und initialisiert sein Resourcefile neu.
-
- Version 0.93 vom Juli 1993
- --------------------------
- Bugfix. appl_init() entfernt. Unter MTOS gabs dabei einen Absturz.
-
- Version 0.94 - 0.95 vom August/September 1993
- ---------------------------------------------
- Erweiterte Returncodes für detailiertere Fehlermeldungen.
-
- Version 0.96 vom November/Dezember 1993
- ---------------------------------------
- Returnwerte für FontId und FontSize bleiben bei ABBRUCH unangetastet.
- Das gilt auch für die Attribute des übergebenen VdiHandles, weil ein
- internes VdiHandle genutzt wird. ufsl->msgfunc(event, msgbuf) ruft
- für die programmeigenen Fenster deren Redrawfunktion auf, damit beim
- Verschieben von UFSL der Hintergrund restauriert wird. "dummy font"
- wird ausgewertet.
-
- ***************************************************************************
-
- MfG Michael Thänitz
-
- Email: MICHAEL THAENITZ @BI im Mausnetz